home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 5 / XCSHELL / XCMD.C < prev    next >
Text File  |  1991-08-31  |  3KB  |  121 lines

  1. //
  2. //    "XcShell" Skeletal XCMD/XFCN    XCMD subfunction checks and router
  3. //
  4. //    Copyright ⌐1991 Mark M. Owen -- All rights reserved
  5. //
  6.  
  7. #define    _XCMD_
  8.  
  9. #include "XCMDutils.h"
  10. #include "XCMDversion.h"
  11. #include "XCMD.h"
  12.  
  13.  
  14. #define    STRING(n)        *(paramPtr->params[(n)])
  15. #define    ERROR(msg)        { Fail( paramPtr, (msg) ); return false; }
  16. #define    CHKERROR(msg)    { int    err = (msg); if(err) ERROR(err); }
  17.  
  18.  
  19. semiprivate void    UnlockParams    (XCmdBlockPtr paramPtr);
  20. semiprivate void    Fail            (XCmdBlockPtr paramPtr,int msg);
  21. semiprivate int        verbNumber        (char *theVerb,pGlobals pGlb);
  22.  
  23.  
  24. int    XCMD(XCmdBlockPtr paramPtr,hGlobals hGlb)
  25. {
  26.     GrafPtr            port;
  27.     Boolean            rtn    = LIVE;
  28.     char            str[256];
  29.     char            verbStr[256];
  30.     int                theVerb;
  31.     int                nParams;
  32.     long            ip[16];
  33.  
  34.     register
  35.         int            i    = 16;
  36.     register
  37.         pGlobals    pGlb;
  38.     register
  39.         long        *pip= ip;
  40.  
  41.     while( i-- ) *pip++ = 0;                //    clear the long parameter containers
  42.  
  43.     GetPort( &port );                        //    save current port for later restoration
  44.     
  45.     global_paramPtr = paramPtr;                //    used by SetReturnValue
  46.     SetReturnValue( "\p" );                    //    assure empty result initially
  47.  
  48.     if( !hGlb )                             //    caller supplied no globals╔
  49.         return DEAD;
  50.  
  51.     for(i=0;i<paramPtr->paramCount;i++) {    //    immobilize the parameter handles
  52.         MoveHHi( (Handle)paramPtr->params[i] );
  53.         HLock( (Handle)paramPtr->params[i] );
  54.     }
  55.     
  56.     if( paramPtr->paramCount < 1 )            //    need at least a verb (XCMD function)
  57.         ERROR( errMissingFunction );
  58.     
  59.     pGlb = *hGlb;                            //    dereference global handle
  60.     
  61.     //    attempt to decode the verb
  62.     
  63.     zero2pas( STRING(0), verbStr );            //    convert C string to Pascal
  64.     
  65.     if( (theVerb = verbNumber( verbStr, pGlb )) == vInError )
  66.         ERROR( errUnrecognizedVerb );
  67.  
  68.     nParams = ( theVerb >= 0 && theVerb < pGlb->nVerbs )?
  69.             *(((char*)((*((short**)(pGlb->hNParams)))+1))+theVerb) + 1    //    Get minimum number of parameters expected
  70.         :
  71.             32767
  72.         ;
  73.     
  74.     //    Check parameter count limits for verbs with optional parameters.  If an optional
  75.     //    parameter is missing, supply an appropriate default value.
  76.     
  77.     switch( theVerb ) {
  78.  
  79.     //////////////////////////////////////////////////////////////
  80.     //    verify variable parameter count verbs here╔                //
  81.     //////////////////////////////////////////////////////////////
  82.  
  83.         default:
  84.             if( paramPtr->paramCount != nParams )
  85.                 ERROR( errWrongParamCount );
  86.     }
  87.  
  88.     if (nParams > 1 ) {    //    convert parameter strings to internal numeric formats
  89.         i = 0;
  90.         pip = ip;
  91.         while( i < nParams ) {
  92.             zero2pas( STRING( i++ ), str );
  93.             StringToNum( str, pip++ );
  94.         }
  95.     }
  96.  
  97.     switch( theVerb ) {    //    Either do the verb here here or delegate it
  98.     
  99.         case vVersion:
  100.             XCMDVersion();
  101.             break;
  102.             
  103.         case vDispose:
  104.             rtn = DEAD;
  105.             break;
  106.         
  107.     //////////////////////////////////////////////////////////////
  108.     //    as in the above cases, route to other verbs here╔        //
  109.     //////////////////////////////////////////////////////////////
  110.  
  111.         default:
  112.             ERROR( errUnrecognizedVerb );
  113.             break;
  114.     }
  115.  
  116.     UnlockParams( paramPtr );    //    unlock some of our locked memory
  117.     SetPort( port );            //    restore the port in case it was changed
  118.     
  119.     return rtn;
  120. }
  121.